package thread_test;

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadDemo15 {
    // 不使用 int 而是使用原子类创建 result
    public static AtomicInteger result = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                // result.getAndIncrement() 就相当于 result++
                result.getAndIncrement();
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                result.getAndIncrement();
            }
        });
        // 启动 t1 与 t2 线程
        t1.start();
        t2.start();
        // 等待 t1 与 t2 线程执行结束
        t1.join();
        t2.join();
        // 输出得到的结果
        System.out.println("result = " + result);
    }
}

//// 下面代码是一段伪代码(不能编译执行,只是用来表示逻辑)
//class AtomicInteger {
//    // value 表示我们要进行自增操作的变量
//    private int value;
//
//    public int getAndIncrement() {
//        // oldValue 表示放到寄存器中的值
//        int oldValue = value;
//        // CAS 进行比较交换
//        while (CAS(value, oldValue, oldValue + 1) != true) {
//            // value 与 oldValue 的值不相等,说明在此期间有其他线程修改了 value 的值
//            // 更新 oldValue 的值与 value 相等,再次进行循环
//            oldValue = value;
//        }
//        // 当 value 与 oldValue 相等,就将 oldValue+1 的值赋值给 value
//        // 以此来实现 value 的自增操作
//        return value;
//    }
//
//    // 下面代码是一段伪代码(不能编译执行,只是用来表示逻辑)
//    // address 表示内存地址
//    // expected 表示一个寄存器
//    // swap 表示一个寄存器
//    // expectedValue 表示寄存器中的值
//    // swapValue 表示寄存器中的值
//    boolean CAS(int address,int expectedValue,int swapValue) {
//        // 比较 address 内存地址中的值是否和 expected 寄存器中的值相同
//        if (address == expectedValue) {
//            // 相同,就把 swap 寄存器中的值和 address 内存地址中的值进行交换
//            address = swapValue;
//            // 返回 true
//            return true;
//        }
//        // 不相同,什么都不做,直接返回 false
//        return false;
//    }
//}

//class SpinLock {
//    // owner 锁对象
//    private Thread owner = null;
//    // 加锁操作
//    public void lock() {
//        // 通过 CAS 来查看当前锁是否被其他线程持有
//        // 如果当前这个锁已经被其他线程持有,就会进入自旋等待
//        // 如果当前这个锁没有被其他线程持有,就把 owner 设为当前尝试加锁的线程
//        while (CAS(this.owner, null, Thread.currentThread())) {
//        }
//    }
//    // 解锁操作
//    public void unlock() {
//        // 将 owner 的引用指向 null,表示当前没有线程持有 owner
//        this.owner = null;
//    }
//}
